/**
 *        资源  管理
 */

export default class qrj_res {
    public static RES = 1;
    public static BUNDLE = 2;
    public static SCENE = 3;

    private static res_all: Res_data[] = []; // 所有已载入资源数据

    /**
     *       添加  RES 资源载入
     * @param file 
     * @param type 
     * @param name 
     */
    public static add_res(_file: string, _type: any, _name = null) {
        let t: Res_data = {
            load_type: qrj_res.RES, // 载入类型
            file: _file,  //文件路径名称
            file_type: _type,
            name: _name,
        };

        qrj_res.res_all.push(t);
    }

    /**
     *       添加  BUNDLE 文件载入
     */
    public static add_bundle() {

    }

    /**
     *       添加  场景载入
     */
    public static add_scene(_file: string) {
        let t: Res_data = {
            load_type: qrj_res.SCENE, // 载入类型
            file: _file,  //文件路径名称
        };
        qrj_res.res_all.push(t);
    }

    /**
     *       开始 加载
     */
    public static async load(compcallback: Function, progcallback: Res_prog_callback) {
        let all: Res_data[] = qrj_res.res_all;
        for (let i = 0; i < all.length; i++) {

            if (all[i].res) {

            } else {
                switch (all[i].load_type) {
                    case qrj_res.RES:
                        await this._load_one_res(all[i], (n) => {
                            progcallback && progcallback(i / all.length + 1 / all.length * n);
                        });
                        break;
                    case qrj_res.SCENE:
                        await this._load_one_scene(all[i], (n) => {
                            progcallback && progcallback(i / all.length + 1 / all.length * n);
                        });
                        break;
                    default:
                        console.log("qrj_res.load() 未实现 类型 " + all[i].load_type);
                        break;
                }
            }
            progcallback && progcallback((i + 1) / all.length);
        }
        compcallback && compcallback();
    }

    public static _load_one_res(rd: Res_data, progcallback: Res_prog_callback) {
        return new Promise((resolve, reject) => {
            if (rd.file_type) {
                let f = rd.file;

                if (cc.ENGINE_VERSION.startsWith("3") == true) {
                    if (rd.file_type == cc.SpriteFrame && !f.endsWith("/spriteFrame")) {
                        f = rd.file + "/spriteFrame";
                    }
                    else if (rd.file_type == cc.Texture2D && !f.endsWith("/texture")) {
                        f = rd.file + "/texture";
                    }
                }

                cc.resources.load(f, rd.file_type,
                    (n, total) => {
                        progcallback && progcallback(n / total);
                    },
                    (err, r) => {
                        if (err) {
                            console.log("---------------------" + f);
                            console.log(err);
                            resolve(false);
                            return;
                        }
                        rd.res = r;
                        resolve(true);
                    });
            } else {
                cc.resources.load(rd.file,
                    (n, total) => {
                        progcallback && progcallback(n / total);
                    }, (err, r) => {
                        if (err) {
                            console.log(err);
                            resolve(false);
                            return;
                        }
                        rd.res = r;
                        resolve(true);
                    });
            }
        });
    }

    public static _load_one_scene(rd: Res_data, progcallback: Res_prog_callback) {
        return new Promise((resolve, reject) => {
            cc.director.preloadScene(rd.file, (n, total) => {
                progcallback && progcallback(n / total);
            }, () => {
                progcallback && progcallback(1);
                resolve(true);
            });
        })
    }

    public static get_res_with_file(file: string): any {
        for (let i = 0; i < qrj_res.res_all.length; i++) {
            const e = qrj_res.res_all[i];
            if (e.file == file) {
                return e.res;
            }
        }
        cc.error("没有找到资源 " + file);
        return null;
    }

    // 通过 文件名 查找资源
    public static res_getWithName(name: string): any {
        for (let i = 0; i < qrj_res.res_all.length; i++) {
            const e = qrj_res.res_all[i];
            if (e.name == name) {
                return e.res;
            }
        }
        cc.error("没有找到资源 别名为: " + name);
        return null;
    }


    public static Load_url_spriteSrame(path: string) {
        cc.log("path ------------ " + path);

        return new Promise((resolve, reject) => {
            //////////////////////////// 2.4 版本
            if (cc.ENGINE_VERSION.startsWith("2.4.") == true) {
                if (path.endsWith('.jpg') || path.endsWith('.png')) {
                    cc.assetManager.loadRemote(path, (err, texture: cc.Texture2D) => {
                        if (err) {
                            cc.error(path, err);
                            reject(null);
                        }
                        else {
                            let spr = new cc.SpriteFrame(texture);
                            resolve(spr);
                        }
                    });
                } else {
                    cc.assetManager.loadRemote(path, { ext: '.png' }, (err, texture: cc.Texture2D) => {
                        if (err) {
                            cc.error(path, err);
                            reject(null);
                        }
                        else {
                            let spr = new cc.SpriteFrame(texture);
                            resolve(spr);
                        }
                    });
                }
                return;
            }
            ///////////////////////////////////2.4以下版本
            if (path.endsWith('.jpg') || path.endsWith('.png')) {
                cc.loader.load(path, (err, ret) => {
                    if (err) {
                        cc.error(path, err);
                        reject(null);
                    }
                    else {
                        let spr = new cc.SpriteFrame(ret);
                        resolve(spr);
                    }
                })
            } else {
                cc.loader.load({ url: path, type: 'png' }, (err, ret) => {
                    if (err) {
                        cc.error(path, err);
                        reject(null);
                    }
                    else {
                        let spr = new cc.SpriteFrame(ret);
                        resolve(spr);
                    }
                })
            }
        })
    }
}

/**
 *     资源管理 数据对象 格式
 */
interface Res_data {
    load_type: number; // 载入类型
    file: string;  //文件路径名称
    res?: any;  // 资源引用
    file_type?: any;   // 类型
    name?: string;    // 别名
}

/**
 *      资源管理 进度 回调 接口
 */
export interface Res_prog_callback {    
    (prog: number): void;
}